﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaPresentacion.Commands;
using CapaPresentacion.Vistas;
using Entidades;
using CapaLogica;
using System.Windows.Input;
using System.Windows;
using System.Windows.Data;
using System.Transactions;

namespace CapaPresentacion.Controles
{
    class PagarCuotaAlumnoViewModel
    {
        public event ReiniciarCU ReiniciarCU;
        public event ReiniciarPagoCuota ReiniciarPagoCuota;
        public event ModificarPagoCuota ModificarPagoCuota;
        public event IrMenuPrincipal IrMenuPrincipal;

        #region Variables

        private CuotaAlumno cuotaAlumno;
        private CuotaAlumno cuotaAlumnoSinModificaciones;

        private int añoPago;
        private string mesPago;

        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;

        #endregion

        #region Propiedades

        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public CuotaAlumno CuotaAlumno
        {
            get { return cuotaAlumno; }
            set { cuotaAlumno = value; }
        }

        public int AñoPago
        {
            get { return añoPago; }
            set { añoPago = value; }
        }

        public string MesPago
        {
            get { return mesPago; }
            set { mesPago = value; }
        }
       

        public List<ViewEntity> ListaAlumnos { get; set; }
        private PagarCuotaAlumno view;

        #endregion

        
        public  PagarCuotaAlumnoViewModel(PagarCuotaAlumno vista, string mes, int año)
        {
                this.view = vista;

                this.view.lblCuotaVigente.Content = new VigenciaParametroLogica().ObtenerCuotaVigenteEnPeriodo(mes, año);

                if (this.view.lblCuotaVigente.Content.ToString() != "NO")
                {
                    
                    this.cuotaAlumno = new CuotaAlumno();
                    this.cuotaAlumno.Eliminada = false;

                    this.mesPago = mes;
                    this.añoPago = año;

                    this.saveCommand = new RelayCommand(GuardarPagoCuota);
                    this.newCommand = new RelayCommand(NuevoPagoCuota);
                    this.openCommand = new RelayCommand(AbrirPagoCuota);

                    this.view.lblPeriodoCuota.Content = mes + "/" + año;
                    this.view.spAlumno.Visibility = Visibility.Collapsed;

                    ListaAlumnos = new PagarCuotaAlumnoLogica().ObtenerAlumnosPorMesAño(mes, año);
                }
                else
                {
                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Debe fijar un precio para la cuota");
                    nueva.ShowDialog();
                    this.ReiniciarCU(CasosDeUso.NuevoParametroGeneral);

                }
            
         }


        public  PagarCuotaAlumnoViewModel(PagarCuotaAlumno vista, CuotaAlumno entidad)
        {
            this.view = vista;

            this.cuotaAlumno = entidad;
            this.cuotaAlumnoSinModificaciones = (CuotaAlumno)entidad.Clone();

            this.view.lblCuotaVigente.Content = new VigenciaParametroLogica().ObtenerCuotaVigente();

            Alumno alumno = new AlumnoLogica().ObtenerEntidad(entidad.Legajo_Alumno);
            this.view.lblPeriodoCuota.Content = cuotaAlumno.MesPago + "/" + cuotaAlumno.AñoPago;
            this.view.lblAlumno.Content = alumno.ApellidoAlumno + ", " + alumno.NombreAlumno + " / DNI: " + alumno.DniAlumno; 
            this.view.spAlumno.Visibility = Visibility.Visible;
            this.view.spListaAlumnos.Visibility = Visibility.Collapsed;

            this.saveCommand = new RelayCommand(GuardarPagoCuota);
            this.newCommand = new RelayCommand(NuevoPagoCuota);
            this.openCommand = new RelayCommand(AbrirPagoCuota);


        }

        private void NuevoPagoCuota(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea cargar los datos de un nuevo pago de cuota?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarPagoCuota(null);
            }
        }

        private void AbrirPagoCuota(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar los datos de un pago de cuota existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ModificarPagoCuota(null);
            }
        }

        private void GuardarPagoCuota(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {                
                    try
                    {
                        if (this.view.spListaAlumnos.Visibility == Visibility.Visible) // Nuevo Pago de Cuota
                        {
                            if (this.Validaciones())
                            {

                                foreach (ViewEntity item in this.view.listaDatos.SelectedItems)
                                {
                                    CuotaAlumno nuevoPago = new CuotaAlumno();
                                    nuevoPago.IdCuotaAlumno = Guid.NewGuid();
                                    nuevoPago.Legajo_Alumno = item.Id;
                                    nuevoPago.MesPago = mesPago;
                                    nuevoPago.AñoPago = añoPago;
                                    nuevoPago.Eliminada = false;
                                    nuevoPago.ImporteCuota = Convert.ToDecimal(this.view.lblCuotaVigente.Content.ToString());

                                    new PagarCuotaAlumnoLogica().Agregar(nuevoPago);
                                }

                                VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El pago de las cuotas ha sido guardado correctamente");
                                nueva.ShowDialog();

                                this.IrMenuPrincipal(null);


                            }
                        }
                        else
                        {
                            cuotaAlumno.ImporteCuota = Convert.ToDecimal(this.view.lblCuotaVigente.Content.ToString());

                            new PagarCuotaAlumnoLogica().Modificar(cuotaAlumno);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El pago de la cuota ha sido modificado correctamente");
                            nueva.ShowDialog();
                            this.IrMenuPrincipal(null);

                        }

                    }
                    catch (Exception)
                    {

                        VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "  Ha ocurrido un error y el pago de la cuota no se ha guardado");
                        nueva.ShowDialog();

                    }

            }

        }

        internal bool Validaciones()
        {

            if (this.view.listaDatos.SelectedItems.Count == 0)
            {
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Debe seleccionar al menos a un alumno de la lista");
                nueva.ShowDialog();
                return false;
            }


            //if (String.IsNullOrWhiteSpace(this.importeCuota))
            //{

            //    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Importe pagado' es obligatorio");
            //    nueva.ShowDialog();
            //    return false;
            //}
            //else
            //{
            //    char[] Importe = this.importeCuota.ToCharArray();
            //    int CantComas = 0;
            //    for (int i = 0; i < Importe.Length; i++)
            //    {
            //        if (Importe[i] == ',')
            //            CantComas++;
            //    }

            //    if (CantComas > 1)
            //    {

            //        VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Importe pagado' ha sido ingresado de forma incorrecta");
            //        nueva.ShowDialog();
            //        return false;

            //    }

            //}

            return true;

        }


    }
}
